React 컀μ€ν ν κ° μνλ₯Ό λκΈ°ννλ κΈ°μ μ νμνμ¬ λ³΅μ‘ν μ ν리μΌμ΄μ μμ μνν μ»΄ν¬λνΈ ν΅μ κ³Ό λ°μ΄ν° μΌκ΄μ±μ ꡬνν©λλ€.
React 컀μ€ν ν μν λκΈ°ν: ν μν μ‘°μ λ¬μ±
React 컀μ€ν
ν
μ μ»΄ν¬λνΈμμ μ¬μ¬μ© κ°λ₯ν λ‘μ§μ μΆμΆνλ κ°λ ₯ν λ°©λ²μ
λλ€. κ·Έλ¬λ μ¬λ¬ ν
μ΄ μνλ₯Ό 곡μ νκ±°λ μ‘°μ ν΄μΌ ν λ 볡μ‘ν΄μ§ μ μμ΅λλ€. μ΄ κΈμμλ React 컀μ€ν
ν
κ°μ μνλ₯Ό λκΈ°ννλ λ€μν κΈ°μ μ νμνμ¬ λ³΅μ‘ν μ ν리μΌμ΄μ
μμ μνν μ»΄ν¬λνΈ ν΅μ κ³Ό λ°μ΄ν° μΌκ΄μ±μ ꡬνν©λλ€. κ°λ¨ν 곡μ μνλΆν° useContext λ° useReducerλ₯Ό μ¬μ©νλ κ³ κΈ κΈ°μ κΉμ§ λ€μν μ κ·Ό λ°©μμ λ€λ£° κ²μ
λλ€.
μ 컀μ€ν ν κ°μ μνλ₯Ό λκΈ°νν΄μΌ ν κΉμ?
λ°©λ²μ μμΈν μμ보기 μ μ 컀μ€ν ν κ°μ μνλ₯Ό λκΈ°νν΄μΌ νλ μ΄μ λ₯Ό μ΄ν΄ν΄ λ΄ μλ€. μ΄λ¬ν μλ리μ€λ₯Ό κ³ λ €ν΄ λ³΄μΈμ.
- 곡μ λ°μ΄ν°: μ¬λ¬ μ»΄ν¬λνΈκ° λμΌν λ°μ΄ν°μ μ‘μΈμ€ν΄μΌ νλ©°, ν μ»΄ν¬λνΈμμ μ΄λ£¨μ΄μ§ λͺ¨λ λ³κ²½ μ¬νμ λ€λ₯Έ μ»΄ν¬λνΈμ λ°μλμ΄μΌ ν©λλ€. μλ₯Ό λ€μ΄, μ ν리μΌμ΄μ μ λ€λ₯Έ λΆλΆμ νμλλ μ¬μ©μ νλ‘ν μ 보μ λλ€.
- μ‘°μ λ μμ : ν ν μ μμ μ΄ λ€λ₯Έ ν μ μνλ₯Ό μ λ°μ΄νΈν΄μΌ ν©λλ€. μ₯λ°κ΅¬λμμ νλͺ©μ μΆκ°νλ©΄ μΉ΄νΈ λ΄μ©κ³Ό λ°°μ‘λΉλ₯Ό κ³μ°νλ λ³λ ν μ΄ λͺ¨λ μ λ°μ΄νΈλλ€κ³ μμν΄ λ³΄μΈμ.
- UI μ μ΄: μ¬λ¬ μ»΄ν¬λνΈμμ λͺ¨λ¬μ κ°μμ±κ³Ό κ°μ 곡μ UI μνλ₯Ό κ΄λ¦¬ν©λλ€. ν μ»΄ν¬λνΈμμ λͺ¨λ¬μ μ΄λ©΄ λ€λ₯Έ μ»΄ν¬λνΈμμλ μλμΌλ‘ λ«νμΌ ν©λλ€.
- νΌ κ΄λ¦¬: λ³λ ν μΌλ‘ κ΄λ¦¬λλ λ€λ₯Έ μΉμ μ΄ μκ³ μ 체 νΌ μνκ° μΌκ΄λμ΄μΌ νλ 볡μ‘ν νΌμ μ²λ¦¬ν©λλ€. μ΄λ λ€λ¨κ³ νΌμμ νν λ°μν©λλ€.
μ μ ν λκΈ°ν μμ΄λ μ ν리μΌμ΄μ μ΄ λ°μ΄ν° λΆμΌμΉ, μμμΉ λͺ»ν λμ λ° μ’μ§ μμ μ¬μ©μ κ²½νμΌλ‘ κ³ ν΅λ°μ μ μμ΅λλ€. λ°λΌμ μν μ‘°μ μ μ΄ν΄λ κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν React μ ν리μΌμ΄μ μ ꡬμΆνλ λ° μ€μν©λλ€.
ν μν μ‘°μ μ μν κΈ°μ
컀μ€ν ν κ°μ μνλ₯Ό λκΈ°ννκΈ° μν΄ λͺ κ°μ§ κΈ°μ μ μ¬μ©ν μ μμ΅λλ€. λ°©λ²μ μ νμ μνμ 볡μ‘μ±κ³Ό ν κ°μ νμν κ²°ν©λ μμ€μ λ°λΌ λ¬λΌμ§λλ€.
1. React Contextλ₯Ό μ¬μ©ν μν 곡μ
useContext ν
μ μ¬μ©νλ©΄ μ»΄ν¬λνΈκ° React 컨ν
μ€νΈλ₯Ό ꡬλ
ν μ μμ΅λλ€. μ΄λ 컀μ€ν
ν
μ ν¬ν¨νμ¬ μ»΄ν¬λνΈ νΈλ¦¬λ₯Ό ν΅ν΄ μνλ₯Ό 곡μ νλ μ’μ λ°©λ²μ
λλ€. 컨ν
μ€νΈλ₯Ό μμ±νκ³ νλ‘λ°μ΄λλ₯Ό μ¬μ©νμ¬ ν΄λΉ κ°μ μ 곡ν¨μΌλ‘μ¨ μ¬λ¬ ν
μ΄ λμΌν μνμ μ‘μΈμ€νκ³ μ
λ°μ΄νΈν μ μμ΅λλ€.
μμ: ν λ§ κ΄λ¦¬
React Contextλ₯Ό μ¬μ©νμ¬ κ°λ¨ν ν λ§ κ΄λ¦¬ μμ€ν μ λ§λ€μ΄ λ³΄κ² μ΅λλ€. μ΄κ²μ μ¬λ¬ μ»΄ν¬λνΈκ° νμ¬ ν λ§(λ°μ λλ μ΄λμ)μ λ°μν΄μΌ νλ μΌλ°μ μΈ μ¬μ© μ¬λ‘μ λλ€.
import React, { createContext, useContext, useState } from 'react';
// ν
λ§ μ»¨ν
μ€νΈ μμ±
const ThemeContext = createContext();
// ν
λ§ νλ‘λ°μ΄λ μ»΄ν¬λνΈ μμ±
const ThemeProvider = ({ children }) => {
const [theme, setTheme] = useState('light');
const toggleTheme = () => {
setTheme((prevTheme) => (prevTheme === 'light' ? 'dark' : 'light'));
};
const value = {
theme,
toggleTheme,
};
return (
{children}
);
};
// ν
λ§ μ»¨ν
μ€νΈμ μ‘μΈμ€νκΈ° μν 컀μ€ν
ν
const useTheme = () => {
const context = useContext(ThemeContext);
if (!context) {
throw new Error('useThemeμ ThemeProvider λ΄μμ μ¬μ©λμ΄μΌ ν©λλ€');
}
return context;
};
export { ThemeProvider, useTheme };
μ€λͺ :
ThemeContext: ν λ§ μνμ μ λ°μ΄νΈ ν¨μλ₯Ό 보μ νλ 컨ν μ€νΈ κ°μ²΄μ λλ€.ThemeProvider: μ΄ μ»΄ν¬λνΈλ μμμκ² ν λ§ μνλ₯Ό μ 곡ν©λλ€.useStateλ₯Ό μ¬μ©νμ¬ ν λ§λ₯Ό κ΄λ¦¬νκ³toggleThemeν¨μλ₯Ό λ ΈμΆν©λλ€.ThemeContext.Providerμvalueμμ±μ ν λ§μ ν κΈ ν¨μλ₯Ό ν¬ν¨νλ κ°μ²΄μ λλ€.useTheme: μ΄ μ»€μ€ν ν μ μ»΄ν¬λνΈκ° ν λ§ μ»¨ν μ€νΈμ μ‘μΈμ€ν μ μλλ‘ ν©λλ€.useContextλ₯Ό μ¬μ©νμ¬ μ»¨ν μ€νΈλ₯Ό ꡬλ νκ³ ν λ§μ ν κΈ ν¨μλ₯Ό λ°νν©λλ€.
μ¬μ© μμ:
import React from 'react';
import { ThemeProvider, useTheme } from './ThemeContext';
const MyComponent = () => {
const { theme, toggleTheme } = useTheme();
return (
νμ¬ ν
λ§: {theme}
);
};
const AnotherComponent = () => {
const { theme } = useTheme();
return (
νμ¬ ν
λ§λ λν: {theme}
);
};
const App = () => {
return (
);
};
export default App;
μ΄ μμμμ MyComponentμ AnotherComponent λͺ¨λ useTheme ν
μ μ¬μ©νμ¬ λμΌν ν
λ§ μνμ μ‘μΈμ€ν©λλ€. MyComponentμμ ν
λ§κ° μ νλλ©΄ AnotherComponentλ λ³κ²½ μ¬νμ λ°μνλλ‘ μλμΌλ‘ μ
λ°μ΄νΈλ©λλ€.
컨ν μ€νΈ μ¬μ©μ μ₯μ :
- κ°λ¨ν 곡μ : μ»΄ν¬λνΈ νΈλ¦¬ μ λ°μ κ±Έμ³ μνλ₯Ό μ½κ² 곡μ ν μ μμ΅λλ€.
- μ€μ μ§μ€μ μν: μνλ λ¨μΌ μμΉ(νλ‘λ°μ΄λ μ»΄ν¬λνΈ)μμ κ΄λ¦¬λ©λλ€.
- μλ μ λ°μ΄νΈ: μ»΄ν¬λνΈλ 컨ν μ€νΈ κ°μ΄ λ³κ²½λ λ μλμΌλ‘ λ€μ λ λλ§λ©λλ€.
컨ν μ€νΈ μ¬μ©μ λ¨μ :
- μ±λ₯ λ¬Έμ : 컨ν μ€νΈλ₯Ό ꡬλ νλ λͺ¨λ μ»΄ν¬λνΈλ 컨ν μ€νΈ κ°μ΄ λ³κ²½λ λ λ€μ λ λλ§λ©λλ€. λ³κ²½λ νΉμ λΆλΆμ μ¬μ©νμ§ μλλΌλ λ§μ°¬κ°μ§μ λλ€. μ΄λ λ©λͺ¨μ΄μ μ΄μ κ³Ό κ°μ κΈ°μ λ‘ μ΅μ νλ μ μμ΅λλ€.
- κΈ΄λ°ν κ²°ν©: μ»΄ν¬λνΈλ 컨ν μ€νΈμ κΈ΄λ°νκ² κ²°ν©λμ΄ ν μ€νΈ λ° λ€λ₯Έ 컨ν μ€νΈμμμ μ¬μ¬μ©μ΄ μ΄λ €μμ§ μ μμ΅λλ€.
- 컨ν μ€νΈ μ§μ₯: 컨ν μ€νΈλ₯Ό κ³Όλνκ² μ¬μ©νλ©΄ 볡μ‘νκ³ κ΄λ¦¬νκΈ° μ΄λ €μ΄ μ»΄ν¬λνΈ νΈλ¦¬κ° λ°μν μ μμ΅λλ€. μ΄λ "prop drilling"κ³Ό μ μ¬ν©λλ€.
2. 컀μ€ν ν μ μ±κΈν€μΌλ‘ μ¬μ©ν μν 곡μ
ν ν¨μ μΈλΆμμ μνλ₯Ό μ μνκ³ ν μ μΈμ€ν΄μ€κ° νλλ§ μμ±λλλ‘ ν¨μΌλ‘μ¨ μ±κΈν€ μν μ νλ 컀μ€ν ν μ λ§λ€ μ μμ΅λλ€. μ΄λ μ μ μ ν리μΌμ΄μ μνλ₯Ό κ΄λ¦¬νλ λ° μ μ©ν©λλ€.
μμ: μΉ΄μ΄ν°
import { useState } from 'react';
let count = 0; // μνλ ν
μΈλΆμμ μ μλ©λλ€.
const useCounter = () => {
const [, setCount] = useState(count); // λ€μ λ λλ§ κ°μ
const increment = () => {
count++;
setCount(count);
};
const decrement = () => {
count--;
setCount(count);
};
return {
count,
increment,
decrement,
};
};
export default useCounter;
μ€λͺ :
count: μΉ΄μ΄ν° μνλuseCounterν¨μ μΈλΆμ μ μλμ΄ μ μ λ³μκ° λ©λλ€.useCounter: ν μ μ μcountλ³μκ° λ³κ²½λ λ λ€μ λ λλ§μ νΈλ¦¬κ±°νκΈ° μν΄ μ£Όλ‘useStateλ₯Ό μ¬μ©ν©λλ€. μ€μ μν κ°μ ν λ΄λΆμ μ μ₯λμ§ μμ΅λλ€.incrementλ°decrement: μ΄λ¬ν ν¨μλ μ μcountλ³μλ₯Ό μμ ν λ€μsetCountλ₯Ό νΈμΆνμ¬ ν μ μ¬μ©νλ λͺ¨λ μ»΄ν¬λνΈκ° λ€μ λ λλ§λκ³ μ λ°μ΄νΈλ κ°μ νμνλλ‘ κ°μ ν©λλ€.
μ¬μ© μμ:
import React from 'react';
import useCounter from './useCounter';
const ComponentA = () => {
const { count, increment } = useCounter();
return (
μ»΄ν¬λνΈ A: {count}
);
};
const ComponentB = () => {
const { count, decrement } = useCounter();
return (
μ»΄ν¬λνΈ B: {count}
);
};
const App = () => {
return (
);
};
export default App;
μ΄ μμμμ ComponentAμ ComponentB λͺ¨λ useCounter ν
μ μ¬μ©ν©λλ€. ComponentAμμ μΉ΄μ΄ν°κ° μ¦κ°νλ©΄ ComponentBλ λμΌν μ μ count λ³μλ₯Ό μ¬μ©νλ―λ‘ λ³κ²½ μ¬νμ λ°μνλλ‘ μλμΌλ‘ μ
λ°μ΄νΈλ©λλ€.
μ±κΈν€ ν μ¬μ©μ μ₯μ :
- κ°λ¨ν ꡬν: κ°λ¨ν μν 곡μ λ₯Ό μν΄ λΉκ΅μ μ½κ² ꡬνν μ μμ΅λλ€.
- μ μ μ‘μΈμ€: 곡μ μνμ λν λ¨μΌ μ§μ€ 곡κΈμμ μ 곡ν©λλ€.
μ±κΈν€ ν μ¬μ©μ λ¨μ :
- μ μ μν λ¬Έμ : κΈ΄λ°νκ² κ²°ν©λ μ»΄ν¬λνΈλ₯Ό μ΄λν μ μμΌλ©°, νΉν λκ·λͺ¨ μ ν리μΌμ΄μ μμ μ ν리μΌμ΄μ μνλ₯Ό μΆλ‘ νκΈ° μ΄λ ΅κ² λ§λλλ€. μ μ μνλ κ΄λ¦¬ λ° λλ²κΉ μ΄ μ΄λ €μΈ μ μμ΅λλ€.
- ν μ€νΈμ μ΄λ €μ: μ μ μνμ μμ‘΄νλ μ»΄ν¬λνΈλ₯Ό ν μ€νΈνλ κ²μ μ μ μνκ° κ° ν μ€νΈ νμ μ λλ‘ μ΄κΈ°νλκ³ μ 리λμλμ§ νμΈν΄μΌ νλ―λ‘ λ 볡μ‘ν μ μμ΅λλ€.
- μ νλ μ μ΄: React Context λλ κΈ°ν μν κ΄λ¦¬ μ루μ μ μ¬μ©νλ κ²μ λΉν΄ μ»΄ν¬λνΈκ° λ€μ λ λλ§λλ μμ κ³Ό λ°©λ²μ λν μ μ΄κ° λν©λλ€.
- λ²κ·Έ κ°λ₯μ±: μνκ° React μλͺ μ£ΌκΈ° μΈλΆμ μκΈ° λλ¬Έμ λ 볡μ‘ν μλ리μ€μμ μμμΉ λͺ»ν λμμ΄ λ°μν μ μμ΅λλ€.
3. 볡μ‘ν μν κ΄λ¦¬λ₯Ό μν Contextμ useReducer μ¬μ©
λ 볡μ‘ν μν κ΄λ¦¬ μλ리μ€μ κ²½μ° useReducerμ useContextλ₯Ό κ²°ν©νλ©΄ κ°λ ₯νκ³ μ μ°ν μ루μ
μ μ 곡ν©λλ€. useReducerλ μν μ νμ μμΈ‘ κ°λ₯ν λ°©μμΌλ‘ κ΄λ¦¬ν μ μλλ‘ νκ³ , useContextλ μ ν리μΌμ΄μ
μ λ°μ κ±Έμ³ μνμ λμ€ν¨μΉ ν¨μλ₯Ό 곡μ ν μ μλλ‘ ν©λλ€.
μμ: μΌν μΉ΄νΈ
import React, { createContext, useContext, useReducer } from 'react';
// μ΄κΈ° μν
const initialState = {
items: [],
total: 0,
};
// 리λμ ν¨μ
const cartReducer = (state, action) => {
switch (action.type) {
case 'ADD_ITEM':
return {
...state,
items: [...state.items, action.payload],
total: state.total + action.payload.price,
};
case 'REMOVE_ITEM':
return {
...state,
items: state.items.filter((item) => item.id !== action.payload.id),
total: state.total - action.payload.price,
};
default:
return state;
}
};
// μΉ΄νΈ μ»¨ν
μ€νΈ μμ±
const CartContext = createContext();
// μΉ΄νΈ νλ‘λ°μ΄λ μ»΄ν¬λνΈ μμ±
const CartProvider = ({ children }) => {
const [state, dispatch] = useReducer(cartReducer, initialState);
return (
{children}
);
};
// μΉ΄νΈ μ»¨ν
μ€νΈμ μ‘μΈμ€νκΈ° μν 컀μ€ν
ν
const useCart = () => {
const context = useContext(CartContext);
if (!context) {
throw new Error('useCartμ CartProvider λ΄μμ μ¬μ©λμ΄μΌ ν©λλ€');
}
return context;
};
export { CartProvider, useCart };
μ€λͺ :
initialState: μΌν μΉ΄νΈμ μ΄κΈ° μνλ₯Ό μ μν©λλ€.cartReducer: μΉ΄νΈ μνλ₯Ό μ λ°μ΄νΈνκΈ° μν΄ λ€μν μ‘μ (ADD_ITEM,REMOVE_ITEM)μ μ²λ¦¬νλ 리λμ ν¨μμ λλ€.CartContext: μΉ΄νΈ μνμ λμ€ν¨μΉ ν¨μλ₯Ό μν 컨ν μ€νΈ κ°μ²΄μ λλ€.CartProvider:useReducerμCartContext.Providerλ₯Ό μ¬μ©νμ¬ μμμκ² μΉ΄νΈ μνμ λμ€ν¨μΉ ν¨μλ₯Ό μ 곡ν©λλ€.useCart: μ»΄ν¬λνΈκ° μΉ΄νΈ μ»¨ν μ€νΈμ μ‘μΈμ€ν μ μλλ‘ νλ 컀μ€ν ν μ λλ€.
μ¬μ© μμ:
import React from 'react';
import { CartProvider, useCart } from './CartContext';
const ProductList = () => {
const { dispatch } = useCart();
const products = [
{ id: 1, name: 'Product A', price: 20 },
{ id: 2, name: 'Product B', price: 30 },
];
return (
{products.map((product) => (
{product.name} - ${product.price}
))}
);
};
const Cart = () => {
const { state } = useCart();
return (
μ₯λ°κ΅¬λ
{state.items.length === 0 ? (
μ₯λ°κ΅¬λκ° λΉμ΄ μμ΅λλ€.
) : (
{state.items.map((item) => (
- {item.name} - ${item.price}
))}
)}
μ΄μ‘: ${state.total}
);
};
const App = () => {
return (
);
};
export default App;
μ΄ μμμμ ProductListμ Cartλ λͺ¨λ useCart ν
μ μ¬μ©νμ¬ μΉ΄νΈ μνμ λμ€ν¨μΉ ν¨μμ μ‘μΈμ€ν©λλ€. ProductListμμ νλͺ©μ μΉ΄νΈμ μΆκ°νλ©΄ μΉ΄νΈ μνκ° μ
λ°μ΄νΈλκ³ Cart μ»΄ν¬λνΈλ μ
λ°μ΄νΈλ μΉ΄νΈ λ΄μ©κ³Ό μ΄μ‘μ νμνλλ‘ μλμΌλ‘ λ€μ λ λλ§λ©λλ€.
useReducerμ Context μ¬μ©μ μ₯μ :
- μμΈ‘ κ°λ₯ν μν μ ν:
useReducerλ μμΈ‘ κ°λ₯ν μν κ΄λ¦¬ ν¨ν΄μ κ°μ νμ¬ λ³΅μ‘ν μν λ‘μ§μ λλ²κΉ νκ³ μ μ§ κ΄λ¦¬νκΈ° μ½κ² λ§λλλ€. - μ€μ μ§μ€μ μν κ΄λ¦¬: μν λ° μ λ°μ΄νΈ λ‘μ§μ 리λμ ν¨μμ μ€μ μ§μ€νλμ΄ μ΄ν΄νκ³ μμ νκΈ° μ½μ΅λλ€.
- νμ₯μ±: μ¬λ¬ κ΄λ ¨ κ°κ³Ό μ νμ ν¬ν¨νλ 볡μ‘ν μνλ₯Ό κ΄λ¦¬νλ λ° μ ν©ν©λλ€.
useReducerμ Context μ¬μ©μ λ¨μ :
- 볡μ‘μ± μ¦κ°: κ°λ¨ν κΈ°μ (μ:
useStateλ₯Ό μ¬μ©ν μν 곡μ )μ λΉν΄ μ€μ μ΄ λ 볡μ‘ν μ μμ΅λλ€. - μμ©κ΅¬ μ½λ: μ‘μ , 리λμ ν¨μ λ° νλ‘λ°μ΄λ μ»΄ν¬λνΈλ₯Ό μ μν΄μΌ νλ―λ‘ μμ©κ΅¬ μ½λκ° λ λ§μμ§ μ μμ΅λλ€.
4. Prop Drilling λ° μ½λ°± ν¨μ (κ°λ₯νλ©΄ νΌνμΈμ)
μ§μ μ μΈ μν λκΈ°ν κΈ°μ μ μλμ§λ§, prop drillingκ³Ό μ½λ°± ν¨μλ₯Ό μ¬μ©νμ¬ μ»΄ν¬λνΈμ ν κ°μ μνμ μ λ°μ΄νΈ ν¨μλ₯Ό μ λ¬ν μ μμ΅λλ€. κ·Έλ¬λ μ΄ μ κ·Ό λ°©μμ μ ν μ¬νκ³Ό μ½λλ₯Ό μ μ§ κ΄λ¦¬νκΈ° μ΄λ ΅κ² λ§λ€ μ μλ μ μ¬λ ₯ λλ¬Έμ 볡μ‘ν μ ν리μΌμ΄μ μμλ μΌλ°μ μΌλ‘ κΆμ₯λμ§ μμ΅λλ€.
μμ: λͺ¨λ¬ κ°μμ±
import React, { useState } from 'react';
const Modal = ({ isOpen, onClose }) => {
if (!isOpen) {
return null;
}
return (
λͺ¨λ¬ λ΄μ©μ
λλ€.
);
};
const ParentComponent = () => {
const [isModalOpen, setIsModalOpen] = useState(false);
const openModal = () => {
setIsModalOpen(true);
};
const closeModal = () => {
setIsModalOpen(false);
};
return (
);
};
export default ParentComponent;
μ€λͺ :
ParentComponent:isModalOpenμνλ₯Ό κ΄λ¦¬νκ³openModalλ°closeModalν¨μλ₯Ό μ 곡ν©λλ€.Modal:isOpenμνμonCloseν¨μλ₯Ό propsλ‘ λ°μ΅λλ€.
Prop Drillingμ λ¨μ :
- μ½λ 볡μ‘μ±: νΉν μ¬λ¬ μ»΄ν¬λνΈ μμ€μ ν΅ν΄ propsλ₯Ό μ λ¬ν λ μ₯ν©νκ³ μ½κΈ° μ΄λ €μ΄ μ½λκ° λ°μν μ μμ΅λλ€.
- μ μ§ κ΄λ¦¬ μ΄λ €μ: μν λλ μ λ°μ΄νΈ ν¨μμ λν λ³κ²½ μ μ¬λ¬ μ»΄ν¬λνΈμμ μμ μ μꡬνλ―λ‘ μ½λ 리ν©ν°λ§ λ° μ μ§ κ΄λ¦¬κ° λ μ΄λ €μμ§λλ€.
- μ±λ₯ λ¬Έμ : μ λ¬λ propsλ₯Ό μ€μ λ‘ μ¬μ©νμ§ μλ μ€κ° μ»΄ν¬λνΈμ λΆνμν λ€μ λ λλ§μ μ λ°ν μ μμ΅λλ€.
κΆμ₯ μ¬ν: 볡μ‘ν μν κ΄λ¦¬ μλ리μ€μ κ²½μ° prop drilling λ° μ½λ°± ν¨μλ₯Ό νΌνμΈμ. λμ React Context λλ μ μ© μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμΈμ.
μ μ ν κΈ°μ μ ν
컀μ€ν ν κ°μ μνλ₯Ό λκΈ°ννλ κ°μ₯ μ’μ κΈ°μ μ μ ν리μΌμ΄μ μ νΉμ μꡬ μ¬νμ λ°λΌ λ¬λΌμ§λλ€.
- κ°λ¨ν 곡μ μν: λͺ κ°μ μ»΄ν¬λνΈ κ°μ κ°λ¨ν μν κ°μ 곡μ ν΄μΌ νλ κ²½μ°
useStateλ₯Ό μ¬μ©νλ React Contextκ° μ’μ μ΅μ μ λλ€. - μ μ μ ν리μΌμ΄μ μν (μ£Όμ): μ±κΈν€ 컀μ€ν ν μ μ μ μ ν리μΌμ΄μ μνλ₯Ό κ΄λ¦¬νλ λ° μ¬μ©ν μ μμ§λ§, μ μ¬μ μΈ λ¨μ (κΈ΄λ°ν κ²°ν©, ν μ€νΈ μ΄λ €μ)μ μ λ νμΈμ.
- 볡μ‘ν μν κ΄λ¦¬: λ 볡μ‘ν μν κ΄λ¦¬ μλ리μ€μ κ²½μ° React Contextμ ν¨κ»
useReducerμ¬μ©μ κ³ λ €νμΈμ. μ΄ μ κ·Ό λ°©μμ μν μ νμ κ΄λ¦¬νλ μμΈ‘ κ°λ₯νκ³ νμ₯ κ°λ₯ν λ°©λ²μ μ 곡ν©λλ€. - Prop Drilling νΌνκΈ°: prop drillingκ³Ό μ½λ°± ν¨μλ μ½λ 볡μ‘μ±κ³Ό μ μ§ κ΄λ¦¬ μ΄λ €μμ μ λ°ν μ μμΌλ―λ‘ λ³΅μ‘ν μν κ΄λ¦¬μλ νΌν΄μΌ ν©λλ€.
ν μν μ‘°μ μ μν λͺ¨λ² μ¬λ‘
- ν μ μ§μ€: ν μ΄ νΉμ μμ λλ λ°μ΄ν° λλ©μΈμ λ΄λΉνλλ‘ μ€κ³νμΈμ. λ무 λ§μ μνλ₯Ό κ΄λ¦¬νλ μ§λμΉκ² 볡μ‘ν ν μ λ§λ€μ§ λ§μΈμ.
- μ€λͺ μ μΈ μ΄λ¦ μ¬μ©: ν λ° μν λ³μμ λͺ ννκ³ μ€λͺ μ μΈ μ΄λ¦μ μ¬μ©νμΈμ. μ΄λ κ² νλ©΄ ν μ λͺ©μ κ³Ό κ΄λ¦¬νλ λ°μ΄ν°λ₯Ό λ μ½κ² μ΄ν΄ν μ μμ΅λλ€.
- ν λ¬Έμν: κ΄λ¦¬νλ μν, μννλ μμ λ° μμ‘΄μ±μ λν μ 보λ₯Ό ν¬ν¨νμ¬ ν μ λν λͺ νν λ¬Έμλ₯Ό μ 곡νμΈμ.
- ν ν μ€νΈ: ν μ΄ μ¬λ°λ₯΄κ² μλνλμ§ νμΈνκΈ° μν΄ ν μ λν λ¨μ ν μ€νΈλ₯Ό μμ±νμΈμ. μ΄λ κ² νλ©΄ λ²κ·Έλ₯Ό μ‘°κΈ°μ λ°κ²¬νκ³ νκ·λ₯Ό λ°©μ§νλ λ° λμμ΄ λ©λλ€.
- μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ κ³ λ €: λκ·λͺ¨μ 볡μ‘ν μ ν리μΌμ΄μ μ κ²½μ° Redux, Zustand λλ Jotaiμ κ°μ μ μ© μν κ΄λ¦¬ λΌμ΄λΈλ¬λ¦¬ μ¬μ©μ κ³ λ €νμΈμ. μ΄λ¬ν λΌμ΄λΈλ¬λ¦¬λ μ ν리μΌμ΄μ μνλ₯Ό κ΄λ¦¬νκΈ° μν κ³ κΈ κΈ°λ₯μ μ 곡νλ©° μΌλ°μ μΈ ν¨μ μ νΌνλ λ° λμμ΄ λ μ μμ΅λλ€.
- μ‘°μ± μ°μ : κ°λ₯ν κ²½μ° λ³΅μ‘ν λ‘μ§μ λ μκ³ μ‘°μ± κ°λ₯ν ν μΌλ‘ λΆν΄νμΈμ. μ΄λ μ½λ μ¬μ¬μ©μ μ΄μ§νκ³ μ μ§ κ΄λ¦¬μ±μ ν₯μμν΅λλ€.
κ³ κΈ κ³ λ € μ¬ν
- λ©λͺ¨μ΄μ μ΄μ
: λΆνμν λ€μ λ λλ§μ λ°©μ§νμ¬ μ±λ₯μ μ΅μ ννκΈ° μν΄
React.memo,useMemoλ°useCallbackμ μ¬μ©νμΈμ. - λλ°μ΄μ± λ° μ€λ‘νλ§: νΉν μ¬μ©μ μ λ ₯ λλ λ€νΈμν¬ μμ²μ λ€λ£° λ μν μ λ°μ΄νΈ λΉλλ₯Ό μ μ΄νκΈ° μν΄ λλ°μ΄μ± λ° μ€λ‘νλ§ κΈ°μ μ ꡬννμΈμ.
- μ€λ₯ μ²λ¦¬: μμμΉ λͺ»ν μΆ©λμ λ°©μ§νκ³ μ¬μ©μμκ² μ μ΅ν μ€λ₯ λ©μμ§λ₯Ό μ 곡νκΈ° μν΄ ν μ μ μ ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬννμΈμ.
- λΉλκΈ° μμ
: λΉλκΈ° μμ
μ λ€λ£° λ
useEffectμ μ μ ν μ’ μμ± λ°°μ΄μ μ¬μ©νμ¬ ν μ΄ νμν κ²½μ°μλ§ μ€νλλλ‘ νμΈμ. `use-async-hook`κ³Ό κ°μ λΌμ΄λΈλ¬λ¦¬λ₯Ό μ¬μ©νμ¬ λΉλκΈ° λ‘μ§μ λ¨μννλ κ²μ κ³ λ €νμΈμ.
κ²°λ‘
React 컀μ€ν ν κ°μ μν λκΈ°νλ κ°λ ₯νκ³ μ μ§ κ΄λ¦¬ κ°λ₯ν μ ν리μΌμ΄μ μ ꡬμΆνλ λ° νμμ μ λλ€. μ΄ κΈμμ μ€λͺ νλ λ€μν κΈ°μ κ³Ό λͺ¨λ² μ¬λ‘λ₯Ό μ΄ν΄νλ©΄ ν¨κ³Όμ μΌλ‘ μν μ‘°μ μ κ΄λ¦¬νκ³ μνν μ»΄ν¬λνΈ ν΅μ μ λ§λ€ μ μμ΅λλ€. νΉμ μꡬ μ¬νμ κ°μ₯ μ ν©ν κΈ°μ μ μ ννκ³ μ½λ λͺ νμ±, μ μ§ κ΄λ¦¬μ± λ° ν μ€νΈ μ©μ΄μ±μ μ°μ μνλ κ²μ μμ§ λ§μΈμ. μκ·λͺ¨ κ°μΈ νλ‘μ νΈλ₯Ό ꡬμΆνλ λκ·λͺ¨ μν°νλΌμ΄μ¦ μ ν리μΌμ΄μ μ ꡬμΆνλ ν μν λκΈ°νλ₯Ό λ§μ€ν°νλ©΄ React μ½λμ νμ§κ³Ό νμ₯μ±μ ν¬κ² ν₯μμν¬ μ μμ΅λλ€.